package com.myway.sms.msmUtil;

import com.myway.pojo.CharterFlight;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

public class SendEmail { // 4. 根据 Session 获取邮件传输对象

    /**
     * JavaMail 版本: 1.6.0
     * JDK 版本: JDK 1.7 以上（必须）
     */
    // 发件人的 邮箱 和 密码（替换为自己的邮箱和密码）
    // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性，给 SMTP 客户端设置了独立密码（有的邮箱称为“授权码”）,
    //     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码（授权码）。
    public static String myEmailAccount = "2623233985@qq.com";
    public static String myEmailPassword = "sfznxtennvxxdicj";

    // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
    // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
    public static String myEmailSMTPHost = "smtp.qq.com";

    // 收件人邮箱（替换为自己知道的有效邮箱）
//    public static String receiveMailAccount = "haoshuai@lingtu.com";

    public static void main(String[] args) throws Exception {
//        sendMail("591246590@qq.com", "123456");
//        CharterFlight charterFlight = new CharterFlight();
//        charterFlight.setFirmName("myway company");
//        charterFlight.setFax("15910538867");
//        charterFlight.setMobile("15910538867");
//        charterFlight.setDepartureTime(new Date());
//        charterFlight.setArrivalTime(new Date());
//        charterFlight.setType("2");
//        sendCharterMail("2641823685@qq.com", charterFlight);
    }

    public static void sendMail(String receiveMailAccount, String code) {
        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
        props.put("mail.smtp.starttls.enable", "true");
        final String smtpPort = "465";
        props.setProperty("mail.smtp.port", smtpPort);
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", smtpPort);

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
        // 3. 创建一封邮件
        MimeMessage message = null;
        Transport transport = null;
        try {
            message = createMimeMessage(session, myEmailAccount, receiveMailAccount, code);
            // 4. 根据 Session 获取邮件传输对象
            transport = session.getTransport();
            transport.connect(myEmailAccount, myEmailPassword);
            // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (transport != null) {
                try {
                    transport.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }

        // 7. 关闭连接

    }

    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param session     和服务器交互的会话
     * @param sendMail    发件人邮箱
     * @param receiveMail 收件人邮箱
     * @return
     * @throws Exception
     */
    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String code) throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);
        // 2. From: 发件人（昵称有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改昵称）
        message.setFrom(new InternetAddress(sendMail, "info@mywayairlines.com", "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "：" + receiveMail, "UTF-8"));

        // 4. Subject: 邮件主题（标题有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改标题）
        message.setSubject("MyWay验证信息", "UTF-8");

        // 5. Content: 邮件正文（可以使用html标签）（内容有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改发送内容）
        message.setContent("hello(您好)" + receiveMail + "!" + "<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;Your verification code is <a href='##'>" + code + "</a>, please do not leak to others, If you do not operate by yourself, please ignore it.<br/>&nbsp;&nbsp;&nbsp;&nbsp;(您的验证码为<a href='##'>" + code + "</a>请勿泄露给他人，如非本人操作请忽略。)", "text/html;charset=UTF-8");

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }

    /**
     * 发送包机邮件
     * @param receiveMailAccount
     * @param charterFlight
     */
    public static void sendCharterMail(String receiveMailAccount, CharterFlight charterFlight){
        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
        props.put("mail.smtp.starttls.enable", "true");
        final String smtpPort = "465";
        props.setProperty("mail.smtp.port", smtpPort);
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", smtpPort);

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log
        // 3. 创建一封邮件
        MimeMessage message = null;
        Transport transport = null;
        try {
            message = createCharterMessage(session, myEmailAccount, receiveMailAccount, charterFlight);
            // 4. 根据 Session 获取邮件传输对象
            transport = session.getTransport();
            transport.connect(myEmailAccount, myEmailPassword);
            // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(message, message.getAllRecipients());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (transport != null) {
                try {
                    transport.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }

    }
    public static MimeMessage createCharterMessage(Session session, String sendMail, String receiveMail, CharterFlight charterFlight) throws Exception{
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);
        // 2. From: 发件人（昵称有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改昵称）
        message.setFrom(new InternetAddress(sendMail, "charter@mywayairlines.com", "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "：" + receiveMail, "UTF-8"));

        // 4. Subject: 邮件主题（标题有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改标题）
        message.setSubject("MyWay Charter Infomation", "UTF-8");

        // 5. Content: 邮件正文（可以使用html标签）（内容有广告嫌疑，避免被邮件服务器误认为是滥发广告以至返回失败，请修改发送内容）
        String charterType = null;
        if(charterFlight.getType().equals("1")){
            charterType = "One Way";
        }else if(charterFlight.getType().equals("2")){
            charterType = "Round Trip(Same day return flight)";
        }else{
            charterType = "Round Trip(different day return flight)";
        }
        Date departureTime = charterFlight.getDepartureTime();
        Date arrivalTime = charterFlight.getArrivalTime();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        String departureTimeStr = dateFormat.format(departureTime);
        String arrivalTimeStr = dateFormat.format(arrivalTime);

        message.setContent("hello(您好)" + receiveMail + "!" + "<br><br>Your have booked our company charter service,the specific contents are as follows:" +
                "<br>" + "Charter Type:" + charterType +
                "<br>" + "Firm Name:" + charterFlight.getFirmName() +
                "<br>" + "Email:" + charterFlight.getEmail() +
                "<br>" + "Mobile:" + charterFlight.getMobile() +
                "<br>" + "Fax:" + charterFlight.getFax() +
                "<br>" + "Departure Point:" + charterFlight.getDeparturePoint() +
                "<br>" + "Arrival Point:" + charterFlight.getArrivalPoint() +
                "<br>" + "Departure Time:" + departureTimeStr +
                "<br>" + "Arrival Time:" + arrivalTimeStr +
                "<br>" + "Special Remarks:" + charterFlight.getSpecialRemarks()
                ,"text/html;charset=UTF-8");

        // 6. 设置发件时间
        message.setSentDate(new Date());

        // 7. 保存设置
        message.saveChanges();

        return message;
    }

}